package com.ruoyi.framework.mybatisplus.strategy;

import com.ruoyi.framework.mybatisplus.strategy.strategies.*;

import java.util.ArrayList;
import java.util.List;

/**
 * 查询策略工厂类
 * 负责管理和创建各种查询策略实例
 * 使用单例模式确保策略实例的唯一性
 * 
 * @author xuzhen97
 */
public class QueryStrategyFactory {
    /**
     * 存储所有可用的查询策略实例
     */
    private static final List<QueryStrategy> strategies = new ArrayList<>();

    static {
        // 注册所有查询策略
        strategies.add(new EqualStrategy());
        strategies.add(new LikeStrategy());
        strategies.add(new LikeLeftStrategy());
        strategies.add(new LikeRightStrategy());
        strategies.add(new GreaterThanStrategy());
        strategies.add(new LessThanStrategy());
        strategies.add(new GreaterEqualStrategy());
        strategies.add(new LessEqualStrategy());
        strategies.add(new IsNullStrategy());
        strategies.add(new NotInStrategy());
        strategies.add(new InStrategy());
        strategies.add(new SortStrategy());
        strategies.add(DefaultStrategy.getInstance());
    }

    /**
     * 根据字段名获取匹配的查询策略
     * 遍历所有策略，返回第一个匹配的策略
     * 如果没有匹配的策略，返回默认策略
     * 
     * @param fieldName 字段名
     * @return 匹配的查询策略实例
     */
    public static QueryStrategy getStrategy(String fieldName) {
        return strategies.stream()
                .filter(strategy -> strategy.matches(fieldName))
                .findFirst()
                .orElse(DefaultStrategy.getInstance());
    }
} 